/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.proyectos.bean;

import com.proyectos.ejb.AdmEjbLocal;
import com.proyectos.ejb.CarEjbLocal;
import com.proyectos.ejb.AlEjbLocal;
import com.proyectos.ejb.DirEjbLocal;
import com.proyectos.ejb.ProEjbLocal;
import com.proyectos.model.Administrador;
import com.proyectos.model.Carreras;
import com.proyectos.model.Directores;
import com.proyectos.model.Propuestas;
import com.proyectos.model.alumnos;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.apache.commons.codec.digest.DigestUtils;
/**
 *
 * @author Jose
 */

public class CtrEntorno implements Serializable {

    @EJB
    CarEjbLocal ocar;
    @EJB
    AlEjbLocal oalu;
    @EJB
    DirEjbLocal odir;
    @EJB
    AdmEjbLocal oadm;
    @EJB
    ProEjbLocal opro;        
    
    Carreras carrera;
    Directores director;
    Administrador admin;
    alumnos alumno;
    String tipo;
    String usuario;
    String password;
    String passwordAnt;
    
    public CtrEntorno() {
        this.tipo = "A";
        
    }

    public Administrador getAdmin() {
        return admin;
    }

    public void setAdmin(Administrador admin) {
        this.admin = admin;
    }

    public String getPasswordAnt() {
        return passwordAnt;
    }

    public void setPasswordAnt(String passwordAnt) {
        this.passwordAnt =passwordAnt;
    }

    public Carreras getCarrera() {
        return carrera;
    }

    public void setCarrera(Carreras carrera) {
        this.carrera = carrera;
    }

    public Directores getDirector() {
        return director;
    }

    public void setDirector(Directores director) {
        this.director = director;
    }

    public alumnos getAlumno() {
        return alumno;
    }

    public void setAlumno(alumnos alumno) {
        this.alumno = alumno;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String validate() {
        if (this.tipo.equals("C")) {
            TreeMap vparametros = new TreeMap();
            vparametros.put("ccodigo", this.usuario.toUpperCase()); //el nombre de usuario el código con el que se da de alta
            List<Carreras> vlista = this.ocar.query("Carreras.findByCodigo", vparametros);
            if (!vlista.isEmpty()) {
                if ((vlista.get(0).getCpassword() == null)||(vlista.get(0).getCpassword().equals(""))) {
                    this.carrera = vlista.get(0);
                    Map<String, Object> options = new HashMap<String, Object>();
                    options.put("modal", true);
                    options.put("draggable", false);
                    options.put("resizable", false);
                    options.put("contentHeight", 180);
                    //options.put("contentWidth",500);
                    RequestContext.getCurrentInstance().openDialog("mantPassword", options, null);
                } else {
                    if (vlista.get(0).getCpassword().equals(DigestUtils.md5Hex(this.password))) {
                        this.carrera = vlista.get(0);
                        return "ok";
                    }
                    else
                           addMessageE("Usuario o contraseña no validos");
                }
            }
        }
        if (this.tipo.equals("A")) {
            TreeMap vparametros = new TreeMap();
            vparametros.put("ccodigo", this.usuario.toUpperCase()); //el nombre de usuario el código con el que se da de alta
            vparametros.put("ncarrera", this.carrera);
            List<alumnos> vlista = this.oalu.query("alumnos.findByCodigo", vparametros);
            if (!vlista.isEmpty()) {
                if ((vlista.get(0).getCpassword() == null)||(vlista.get(0).getCpassword().equals(""))) {
                    this.alumno = vlista.get(0);
                    Map<String, Object> options = new HashMap<String, Object>();
                    options.put("modal", true);
                    options.put("draggable", false);
                    options.put("resizable", false);
                    options.put("contentHeight", 180);
                    //options.put("contentWidth",500);
                    RequestContext.getCurrentInstance().openDialog("mantPassword", options, null);
                } else {
                    if (vlista.get(0).getCpassword().equals(DigestUtils.md5Hex(this.password))) {
                        this.alumno = vlista.get(0);
                        //this.carrera=vlista.get(0).getNcarrera();
                        return "ok";
                    }
                    else
                           addMessageE("Usuario o contraseña no validos");
                }
            }
        }
         if (this.tipo.equals("D")) {
            TreeMap vparametros = new TreeMap();
            vparametros.put("ccodigo", this.usuario.toUpperCase()); //el nombre de usuario el código con el que se da de alta
            vparametros.put("ncarrera", this.carrera);
            List<Directores> vlista = this.odir.query("Directores.findByCodigo", vparametros);
            if (!vlista.isEmpty()) {
                if ((vlista.get(0).getCpassword() == null)||(vlista.get(0).getCpassword().equals(""))) {
                    this.director = vlista.get(0);
                    Map<String, Object> options = new HashMap<String, Object>();
                    options.put("modal", true);
                    options.put("draggable", false);
                    options.put("resizable", false);
                    options.put("contentHeight", 180);
                    //options.put("contentWidth",500);
                    RequestContext.getCurrentInstance().openDialog("mantPassword", options, null);
                } else {
                    if (vlista.get(0).getCpassword().equals(DigestUtils.md5Hex(this.password))) {
                        this.director = vlista.get(0);
                        //this.carrera=vlista.get(0).getNcarrera();
                        return "ok";
                    }
                    else
                           addMessageE("Usuario o contraseña no validos");
                }
            }
        }
        if (this.tipo.equals("R")) 
        {
            TreeMap vparametros = new TreeMap();
            vparametros.put("ccodigo", this.usuario.toUpperCase()); //admin
            List<Administrador> vlista = this.oadm.query("Administrador.findByCodigo", vparametros);
            if (!vlista.isEmpty()) {
                if ((vlista.get(0).getCpassword().equals(DigestUtils.md5Hex(this.password)))){
                     this.admin=vlista.get(0);
                     return "ok";
                }
                    
               else {
                   
                   addMessageE("Usuario o contraseña no validos");
                    return "FAIL";
                }
                    
                    
             }
         }  
            
         return "FAIL";
                  
        }
        
      
    

    
    public void cambiarPasswordAnt(ActionEvent event) {
        
        if (this.tipo.equals("C")) {
            
            if(this.carrera.getCpassword().equals(DigestUtils.md5Hex(passwordAnt))){
              
                this.carrera.setCpassword(DigestUtils.md5Hex(password));
                try {
                    this.ocar.save(carrera);
                    addMessage("El password ha sido cambiado");
                
                } catch (Exception ex) {
                    Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
                }
            }    
            else
                   addMessage("El password anterior no es valido");
           

        }
        if (this.tipo.equals("A")) {
                if(this.alumno.getCpassword().equals(DigestUtils.md5Hex(passwordAnt))){
                    this.alumno.setCpassword(DigestUtils.md5Hex(password));
                    try {
                        this.oalu.save(alumno);
                        addMessage("El password ha sido cambiado");
                     
                    } catch (Exception ex) {
                        Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else
                    addMessage("El password anterior no es valido");
        }
        
        if (this.tipo.equals("D")) {
            if(this.director.getCpassword().equals(DigestUtils.md5Hex(passwordAnt))){
                this.director.setCpassword(DigestUtils.md5Hex(password));
                try {
                    this.odir.save(director);
                    addMessage("El password ha sido cambiado");
                  
                } catch (Exception ex) {
                    Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            else
               addMessage("El password anterior no es valido");
        }
          if (this.tipo.equals("R")) {
            if(this.admin.getCpassword().equals(DigestUtils.md5Hex(passwordAnt))){
                this.admin.setCpassword(DigestUtils.md5Hex(password));
             
                 try {
                    this.oadm.save(admin);
                     addMessage("El password ha sido cambiado");
                   
                 } catch (Exception ex) {

                addMessage("El password anterior no es valido");
                }
              }
          }
    }
     public void addMessageE(String summary) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, summary, null);
        FacesContext.getCurrentInstance().addMessage(null, message);
   }
     public void cambiarPassword(ActionEvent event) {
       
        if (this.tipo.equals("C")) {
            this.carrera.setCpassword(DigestUtils.md5Hex(this.password));
            try {
                this.ocar.save(carrera);
                RequestContext.getCurrentInstance().closeDialog(null);
            } catch (Exception ex) {
                Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        if (this.tipo.equals("A")) {
            this.alumno.setCpassword(DigestUtils.md5Hex(this.password));
            try {
                this.oalu.save(alumno);
                RequestContext.getCurrentInstance().closeDialog(null);
            } catch (Exception ex) {
                Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        if (this.tipo.equals("D")) {
            this.director.setCpassword(DigestUtils.md5Hex(this.password));
            try {
                this.odir.save(director);
                RequestContext.getCurrentInstance().closeDialog(null);
            } catch (Exception ex) {
                Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
    public String getTip()
    {
        if (this.tipo.equals("C"))
            return "COORDINADOR";
        if (this.tipo.equals("D"))
            return "DIRECTOR";
        if (this.tipo.equals("R"))
            return "ADMINISTRADOR";
        if (this.tipo.equals("A"))
          return "ALUMNO";
       
        return "NONE";
    }
    public String getCar()
    {
        if (this.tipo.equals("R"))
            return "NONE";
        else
          return carrera.getCnombre().toUpperCase();
       
       
    }
    public String getNombre()
    {
        if (this.tipo.equals("R"))
            return "ADMINISTRADOR";
        if (this.tipo.equals("C"))
           return this.carrera.getCcoordinador().toUpperCase();
        if (this.tipo.equals("D"))
           return  this.director.getCapellidos().toUpperCase()+", "+this.director.getCnombre().toUpperCase();
        if (this.tipo.equals("A"))
           return  this.alumno.getCapellidos().toUpperCase()+", "+ this.alumno.getCnombre().toUpperCase();
        
        return "UNDEFINED";
     
    }
    public boolean mostrar(String page)
    {
        
        if (page.equals("CAR"))
        {
            return this.tipo.equals("R");
          
        }
        if (page.equals("ALU"))
        {
            return ( this.tipo.equals("A")||this.tipo.equals("C")) ;
          
        }
        if (page.equals("ALUONLY"))
        {
            return ( this.tipo.equals("A")) ;
          
        }
        if (page.equals("DIR"))
        {
            return ( this.tipo.equals("C")||this.tipo.equals("D")) ;
          
        }
        if (page.equals("PRO"))
        {
            return ( this.tipo.equals("C")) ;
          
        }
        if (page.equals("HIT"))
        {
            return ( this.tipo.equals("C")) ;
          
        }
        if (page.equals("PWD"))
        {
            return ( this.tipo.equals("R") || this.tipo.equals("A")||this.tipo.equals("C")||this.tipo.equals("D")) ;
          
        }
        return false;
      
    }
    
     public void addMessage(String summary) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, null);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
    

     public void resetPassword()
     {
         this.password="";
         this.passwordAnt="";
     }
     
     public boolean esAdmin(){
         return this.tipo.equals("R");
     }
     public boolean esCoor(){
         return this.tipo.equals("C");
     }
     public boolean esDir(){
         return this.tipo.equals("D");
     }
      public boolean esAlu(){
         return this.tipo.equals("A");
     }
      
      
     
     
     public void cambiarPasswordForm(ActionEvent event){
         
          try {
            Map<String, Object> options = new HashMap<String, Object>();
            options.put("modal", true);
            options.put("draggable", false);
            options.put("resizable", false);
            options.put("contentHeight", 250);
            options.put("contentWidth",450);
            RequestContext.getCurrentInstance().openDialog("mantPasswordCambio", options, null);
            } catch (Exception ex) {
            Logger.getLogger(CtrEntorno.class.getName()).log(Level.SEVERE, null, ex);
            }
     }
     
     public String getStado(){
             List<Propuestas> lista;
             String salida="";
             if (this.tipo.equals("A"))
             {
                TreeMap vparametros = new TreeMap();
                vparametros.put("ncarrera", this.carrera);
                vparametros.put("nalumno", this.alumno);
                lista = this.opro.query("Propuestas.findByAlumnoAcep", vparametros);
                if(lista.isEmpty()){
                     
                     lista = this.opro.query("Propuestas.findByAlumnoDen", vparametros);
                      if(!lista.isEmpty())
                          salida="Proyecto Denegado. Pongase en contacto con el coordinador";
                 }    
                else
                    salida="Proyecto Aprobado. Pongase en contacto con su director";
           
           
                 
             }
             return salida;
     }
     
     
     public String cerrar() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false);
        httpSession.invalidate();
        return "index";
    }
}
